package jp.chiheisen.popuptail;


import jp.chiheisen.common.ResourceInputStream;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;

public class PopupTailTrayIcon implements ActionListener {
    /** トレイアイコンのツールチップ */
    private static final String TOOLTIP = "%s を監視中 - PopupTail";
    /** バルーンの説明文 */
    private static final String BALOON_CAPTION = "%s が変更されました。";

	/** アイコンのパス */
	private static final String ICON_PATH = "META-INF/trayicon.png";

    /** バルーンをクリックしたときに開くファイル */
    private final File file;
	/** トレイアイコン */
	private final TrayIcon icon;

    public PopupTailTrayIcon(File file) throws IOException, AWTException {
        this.file = file;

        try(InputStream input = new ResourceInputStream(ICON_PATH)){
			Image image = ImageIO.read(input);
            String tooltip = String.format(TOOLTIP, file.getName());
            TrayIcon icon = new TrayIcon(image, tooltip);
            icon.setPopupMenu(createMenu());
            SystemTray.getSystemTray().add(icon);

            icon.addActionListener(this);

            this.icon = icon;
        }
    }

	public void displayMessage(String message, TrayIcon.MessageType messageType) {
        String caption = String.format(BALOON_CAPTION, file.getName());
        this.icon.displayMessage(caption, message, messageType);
	}

	private PopupMenu createMenu() {
        MenuItem exitMenuItem = new MenuItem("終了");
        exitMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                System.exit(0);
            }
        });
        MenuItem openMenuItem = new MenuItem(file.getName() + " を開く");
        openMenuItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent event) {
                open();
            }
        });

        PopupMenu menu = new PopupMenu();
        menu.add(exitMenuItem);
        menu.addSeparator();
        menu.add(openMenuItem);

		return menu;
	}

    /**
     * トレイアイコンがダブルクリックされたときのイベント
     */
    @Override
    public void actionPerformed(ActionEvent event) {
        open();
    }

    private void open(){
        Desktop desktop = Desktop.getDesktop();
        try {
            desktop.open(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
